﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using estudent.Models;

namespace estudent.Controllers
{
    public class SeznamRezultatiPisnegaIzpitaController : Controller
    {
        estudentEnt db = null;

        // GET: /SeznamRezultatiPisnegaIzpita/

        public ActionResult Index()
        {
            db = new estudentEnt();
            IEnumerable<SProfesorji> profesorji = null;
            string role = Session["Role"].ToString();

            if (role.CompareTo("refe") == 0)
            {
                profesorji = from p in db.SProfesorjis
                             orderby p.priimekProfesor, p.imeProfesor
                             select p;
                ViewData["profesorji"] = profesorji;

            }
            else //if (role.CompareTo("prof") == 0)
            {
                int idProf = Int32.Parse(Session["Name"].ToString());
                ViewData["profesor"] = "neprazno";

                profesorji = from p in db.SProfesorjis
                             where p.sProfesor == idProf
                             select p;
                ViewData["profesorji"] = profesorji;

                IEnumerable<Poucuje> predmeti = db.Poucujes
                    .Where(p => p.sProfesor1 == idProf || p.sProfesor2 == idProf || p.sProfesor3 == idProf)
                    .OrderBy(p => p.sPredmeti.imePredmeta)
                    .ThenBy(p => p.sPredmeti.sPredmeta)
                    .Select(g => g);



                ViewData["predmeti"] = predmeti;
            }

            return View("SeznamRezultatiPisnegaIzpita");
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public string PoisciRoke(FormCollection form)
        {
            db = new estudentEnt();

            int sifraPouc = Int32.Parse(form["soprofesorji"]);

            var roki = db.IzpitniRokis
                .Where(p => p.idPoucuje == sifraPouc)
                .Where(p => p.datumRoka <= DateTime.Now)
                .OrderByDescending(p => p.datumRoka);


            string izhod = "<option value=\"prazen\">Izberite rok</option>";
            foreach (var ele in roki)
            {
                izhod += ("<option value=\"" + ele.datumRoka + "\">" + ele.datumRoka.ToShortDateString() + " " + ele.datumRoka.ToShortTimeString() + "</option>");
            }
            return izhod;
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public string SoProfesorji(FormCollection form)
        {
            db = new estudentEnt();

            int sifraProf = Int32.Parse(form["profesor"]);
            int sifraPred = Int32.Parse(form["predmet"]);

            var profesorji = db.Poucujes
                .Where(p => p.sPredmeta == sifraPred)
                .Where(p => p.sProfesor1 == sifraProf || p.sProfesor2 == sifraProf || p.sProfesor2 == sifraProf)
                .OrderByDescending(p => p.idPoucuje)
                .Select(p => p);

            string izhod = "<option value=\"prazen\">Izberite so-predavatelja/e</option>";
            var profi = "";
            SProfesorji prof = null;


            foreach (var ele in profesorji)
            {
                if (ele.sProfesor1 != sifraProf)
                {
                    prof = db.SProfesorjis
                       .Where(p => p.sProfesor == ele.sProfesor1)
                       .FirstOrDefault();
                    profi += prof.imeProfesor + " " + prof.priimekProfesor + " - " + prof.sProfesor;
                }
                if (ele.sProfesor2 != null && ele.sProfesor2 != sifraProf)
                {
                    prof = db.SProfesorjis
                        .Where(p => p.sProfesor == ele.sProfesor2)
                        .FirstOrDefault();
                    if (profi != "")
                        profi += ", ";
                    profi += prof.imeProfesor + " " + prof.priimekProfesor + " - " + prof.sProfesor;
                }
                if (ele.sProfesor3 != null && ele.sProfesor3 != sifraProf)
                {
                    prof = db.SProfesorjis
                        .Where(p => p.sProfesor == ele.sProfesor3)
                        .FirstOrDefault();
                    if (profi != "")
                        profi += ", ";
                    profi += prof.imeProfesor + " " + prof.priimekProfesor + " - " + prof.sProfesor;
                }
                if (profi == "")
                    profi = "brez";
                izhod += ("<option value=\"" + ele.idPoucuje + "\">" + profi + "</option>");
                profi = "";
            }
            return izhod;
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public string Poisci(FormCollection form)
        {
            db = new estudentEnt();

            int idProf = Int32.Parse(form["profesor"]);

            IEnumerable<Poucuje> predmeti = db.Poucujes
                    .Where(p => p.sProfesor1 == idProf || p.sProfesor2 == idProf || p.sProfesor3 == idProf)
                    .OrderBy(p => p.sPredmeti.imePredmeta)
                    .ThenBy(p => p.sPredmeti.sPredmeta)
                    .Select(g => g);

            string izhod = "<option value=\"prazen\">Izberite predmet</option>";
            decimal pred = 0;
            foreach (var ele in (IEnumerable<Poucuje>)predmeti)
            {
                if (pred != ele.sPredmeta)
                    izhod += ("<option value=\"" + ele.sPredmeta + "\">" + ele.sPredmeti.imePredmeta + " - " + ele.sPredmeta + "</option>");
                pred = ele.sPredmeta;
            }

            return izhod;
        }


        [AcceptVerbs(HttpVerbs.Post)]
        public string PoisciKandidate(FormCollection form)
        {
            db = new estudentEnt();

            int sifraPouc = Int32.Parse(form["soprofesorji"]);
            DateTime datum = Convert.ToDateTime(form["roki"]);

            var max = "";
            var meja = "";
            var izpit = db.IzpitniRokis
                .Where(p => p.idPoucuje == sifraPouc)
                .Where(p => p.datumRoka == datum);

            foreach (var ele in izpit)
            {
                max = ele.maxTock.ToString();
                meja = ele.pozitivnaMeja.ToString();
            }
            string a = "Število možnih točk NI določeno! ";
            string b = "Meja za pozitivno oceno NI določena! ";
            if (max.Length > 0)
            {
                a = "Število možnih točk: " + max + ". ";
            }
            if (max.Length > 0)
            {
                b = "Meja za pozitivno oceno: " + meja + ".";
            }
            string izhod = a + b + "</p><div align='center'><table width=100% border=\"1\" cellpadding=\"0\" cellspacing=\"0\">";

            var kandidati = db.PrijaveNaIzpits
                .Where(p => p.idPoucuje == sifraPouc)
                .Where(p => p.datumRoka == datum)
                .OrderBy(p => p.Vpisi.Studenti.priimek)
                .ThenBy(p => p.Vpisi.Studenti.ime);

            var opravljanj = db.PrijaveNaIzpits
                    .Where(p => p.idPoucuje == sifraPouc)
                    .Where(p => p.datumRoka <= datum)
                    .Where(p => p.ocena != -1 || p.ocena == null)
                    .GroupBy(p => new { p.IzpitniRoki.Poucuje.sPredmeta, p.Vpisi.username })
                    .Select(skup => new { sPredmeta = skup.Key.sPredmeta, username = skup.Key.username, polaganj = skup.Count() });

            izhod += "<tr align='center'><th>Zap.št.</th><th>Vpisna št.</th><th>Priimek</th><th>Ime</th><th>Leto</th><th>Opravljanj</th><th>Plača?</th><th>Ocena</th><th>Točk</th></tr>";
            int i = 0;

            int letoPoslus;
            foreach (var ele in kandidati)
            {
                letoPoslus = ele.Vpisi.letoVpisa.Year + 1;
                i++;
                izhod += "<tr align='center'>";
                izhod += "<td>" + i + "</td>";
                izhod += "<td>" + ele.Vpisi.username + "</td>";
                izhod += "<td>" + ele.Vpisi.Studenti.priimek + "</td>";
                izhod += "<td>" + ele.Vpisi.Studenti.ime + "</td>";
                izhod += "<td>" + ele.Vpisi.letoVpisa.Year + "/" + letoPoslus + "</td>";

                var skupno = opravljanj
                    .Where(p => p.username == ele.Vpisi.username)
                    .FirstOrDefault();

                var skup = 0;
                if (ele.ocena == -1)
                    skup += 1;

                if (skupno != null)
                    skup += skupno.polaganj;

                if (db.Vpisis.Any(p => p.idVrstaVpisa == "V2" && p.username == ele.Vpisi.username))
                {
                    var leto = db.Vpisis
                        .Where(p => p.idVrstaVpisa == "V2" && p.username == ele.Vpisi.username)
                        .Select(o => new { letoPonav = o.letoVpisa, letnik = o.idLetnikStudija })
                        .FirstOrDefault();

                    var prvic = db.Vpisis
                        .Where(p => p.idVrstaVpisa == "V1" && p.username == ele.Vpisi.username)
                        .Where(p => p.idLetnikStudija == leto.letnik)
                        .FirstOrDefault();

                    if (leto.letoPonav > datum)
                    {
                        izhod += "<td>" + skup + "</td>";
                        if (skup >= 4)
                            izhod += "<td>Da</td>";
                        else
                            izhod += "<td>&nbsp;</td>";
                    }
                    else
                    {
                        var predPon = db.PrijaveNaIzpits
                        .Where(p => p.idVpisa == prvic.idVpisa)
                        .Where(p => p.idPoucuje == sifraPouc)
                        .Where(p => p.Vpisi.username == ele.Vpisi.username)
                        .Where(p => p.ocena != -1 || p.ocena == null)
                        .GroupBy(p => new { p.Vpisi.username })
                        .Select(o => new { predPonavljanj = o.Count() })
                        .FirstOrDefault();

                        if (predPon != null && predPon.predPonavljanj > 0)
                        {
                            izhod += "<td>" + skup + "-" + predPon.predPonavljanj + "</td>";
                            if ((skupno.polaganj - predPon.predPonavljanj) >= 4)
                                izhod += "<td>Da</td>";
                            else
                                izhod += "<td>&nbsp;</td>";
                        }
                        else
                        {
                            izhod += "<td>" + skup + "</td>";
                            if (skup >= 4)
                                izhod += "<td>Da</td>";
                            else
                                izhod += "<td>&nbsp;</td>";
                        }
                    }

                }
                else
                {
                    izhod += "<td>" + skup + "</td>";
                    if (skup >= 4)
                        izhod += "<td>Da</td>";
                    else
                        izhod += "<td>&nbsp;</td>";
                }

                var oc = "VP";
                if (ele.ocena != -1)
                    oc = ele.ocena.ToString();
                izhod += "<td>&nbsp;" + oc + "&nbsp;</td>";
                izhod += "<td>&nbsp;" + ele.dosezeneTocke + "&nbsp;</td>";

                izhod += "</tr></div>";
            }
            if (kandidati.Count() < 1)
                izhod = "Za izbrani rok ni kandidatov!";
            return izhod;
        }
    }
}
